package api

import (
	"bytes"
	"io"
	"net/http"
	"time"

	"github.com/catroll/fastdns/internal/logger"
)

// responseWriter 是一个自定义的 http.ResponseWriter，用于捕获响应状态码和响应体
type responseWriter struct {
	http.ResponseWriter
	statusCode int
	buffer     *bytes.Buffer
}

// WriteHeader 实现 http.ResponseWriter 接口
func (rw *responseWriter) WriteHeader(statusCode int) {
	rw.statusCode = statusCode
	rw.ResponseWriter.WriteHeader(statusCode)
}

// Write 实现 http.ResponseWriter 接口
func (rw *responseWriter) Write(b []byte) (int, error) {
	// 写入到缓冲区以便日志记录
	rw.buffer.Write(b)
	// 同时写入到原始响应
	return rw.ResponseWriter.Write(b)
}

// LoggingMiddleware 创建一个记录 API 请求和响应的中间件
func LoggingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 开始时间
		start := time.Now()

		// 读取请求体
		var requestBody []byte
		if r.Body != nil {
			requestBody, _ = io.ReadAll(r.Body)
			// 重新设置请求体，因为 ReadAll 会消耗它
			r.Body = io.NopCloser(bytes.NewBuffer(requestBody))
		}

		// 创建自定义响应写入器
		rw := &responseWriter{
			ResponseWriter: w,
			statusCode:     http.StatusOK, // 默认状态码
			buffer:         &bytes.Buffer{},
		}

		// 记录请求日志
		logger.Info("API 请求",
			"method", r.Method,
			"path", r.URL.Path,
			"remote_addr", r.RemoteAddr,
			"user_agent", r.UserAgent(),
			"request_body", string(requestBody),
		)

		// 调用下一个处理器
		next.ServeHTTP(rw, r)

		// 计算请求处理时间
		duration := time.Since(start)

		// 记录响应日志
		logger.Info("API 响应",
			"method", r.Method,
			"path", r.URL.Path,
			"status", rw.statusCode,
			"duration", duration.String(),
			"response_size", rw.buffer.Len(),
			"response_body", rw.buffer.String(),
		)
	})
}

// WrapHandlerWithLogging 包装单个处理器函数，添加日志记录
func WrapHandlerWithLogging(handler http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// 使用中间件包装处理器
		LoggingMiddleware(handler).ServeHTTP(w, r)
	}
}

// EnableCORS 添加 CORS 头部到响应
func EnableCORS(w http.ResponseWriter) {
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
	w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
}

// HandleOptions 处理 OPTIONS 请求
func HandleOptions(w http.ResponseWriter, r *http.Request) bool {
	if r.Method == http.MethodOptions {
		EnableCORS(w)
		w.WriteHeader(http.StatusOK)
		return true
	}
	return false
}

// WrapWithCORS 包装处理器函数，添加 CORS 支持
func WrapWithCORS(handler http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// 处理 OPTIONS 请求
		if HandleOptions(w, r) {
			return
		}

		// 添加 CORS 头部
		EnableCORS(w)

		// 调用原始处理器
		handler(w, r)
	}
}

// WrapWithLoggingAndCORS 包装处理器函数，添加日志记录和 CORS 支持
func WrapWithLoggingAndCORS(handler http.HandlerFunc) http.HandlerFunc {
	return WrapHandlerWithLogging(WrapWithCORS(handler))
}
